package com.zzgele.qmzb.api.utils;

import com.alibaba.fastjson.JSON;
import com.zzgele.qmzb.api.core.Constants;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;
import org.netease.im.NIMPost;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Martin on 2017-07-09.
 */
public class NeteaseImUtil {
    private final static Logger logger = LoggerFactory.getLogger(NeteaseImUtil.class);
    private static String BaseUrl = "https://api.netease.im/nimserver/";

    /**
     * 统一封装网易IM post
     * @param url
     * @param params
     * @return
     */
    public static String post(String url, List<NameValuePair> params) {
        try {
            logger.debug(params.toString());

            //UTF-8编码,解决中文问题
            HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");

            String res = NIMPost.postNIMServer(url, entity, Constants.NETEASE_APPKEY, Constants.NETEASE_SECRET, false);
            logger.debug("{} : {}", url, res);

            if(StringUtil.isEmpty(res)) {
                logger.warn("{} : {}", url, res);
            }

            return res;
        } catch (IOException e) {
            return "";
        }
    }

    /**
     * 创建IM帐号
     * @param accid accid 网易云通信ID，最大长度32字符，必须保证一个APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理，请注意以此接口返回结果中的accid为准）
     * @param name 可选，网易云通信ID昵称，最大长度64字符，用来PUSH推送时显示的昵称
     * @param props 可选，json属性，第三方可选填，最大长度1024字符
     * @param icon 可选，网易云通信ID头像URL，第三方可选填，最大长度1024icon
     * @return
     */
    public static String createUser(String accid, String name, String props, String icon) {
        String url = BaseUrl + "user/create.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("accid", accid)); //以返回为准
        params.add(new BasicNameValuePair("name", name)); //可选，以返回为准
        params.add(new BasicNameValuePair("props", props)); //可选
        params.add(new BasicNameValuePair("icon", icon)); //可选
        //params.add(new BasicNameValuePair("token", token)); //可选，以返回为准，网易云通信ID可以指定登录token值，最大长度128字符，并更新，如果未指定，会自动生成token，并在创建成功后返回

        return post(url, params);
    }

    /**
     * 更新用户名片
     * @param accid 用户帐号，最大长度32字符，必须保证一个APP内唯一
     * @param name 可选，用户昵称，最大长度64字符
     * @param icon 可选，用户icon，最大长度1024字符
     * @param sign 可选，用户签名，最大长度256字符
     * @param birth 可选，用户生日，最大长度16字符
     * @param gender 可选，用户性别，0表示未知，1表示男，2女表示女，其它会报参数错误
     * @param ex 可选，用户名片扩展字段，最大长度1024字符，用户可自行扩展，建议封装成JSON字符串
     * @return
     */
    public static String updateUinfo(String accid, String name, String icon, String sign, String birth, int gender, String ex) {
        String url = BaseUrl + "user/updateUinfo.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("accid", accid)); //以返回为准
        params.add(new BasicNameValuePair("name", name)); //可选，以返回为准
        params.add(new BasicNameValuePair("icon", icon)); //可选
        params.add(new BasicNameValuePair("sign", sign)); //可选
        params.add(new BasicNameValuePair("birth", birth)); //可选
        params.add(new BasicNameValuePair("gender", String.valueOf(gender))); //可选
        params.add(new BasicNameValuePair("ex", ex)); //可选
        //params.add(new BasicNameValuePair("token", token)); //可选，以返回为准，网易云通信ID可以指定登录token值，最大长度128字符，并更新，如果未指定，会自动生成token，并在创建成功后返回

        return post(url, params);
    }

    /**
     * 聊天室创建
     * @param creator  聊天室属主的账号accid
     * @param name  聊天室名称，长度限制128个字符
     * @param announcement  可选，公告，长度限制4096个字符
     * @param broadcasturl 直播地址，长度限制1024个字符
     * @param ext 可选，扩展字段，最长4096字符
     * @return
     */
    public static String chatroomCreate(String creator, String name, String announcement, String broadcasturl,
                                        String ext) {
        String url = BaseUrl + "chatroom/create.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        announcement = StringUtil.isEmpty(announcement)? Constants.ANNOUNCEMENT_DEF : announcement;

        params.add(new BasicNameValuePair("creator", creator));
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("announcement", announcement));
//        params.add(new BasicNameValuePair("broadcasturl", broadcasturl));
        params.add(new BasicNameValuePair("ext", ext));

        return post(url, params);
    }

    /**
     * 聊天室信息查询
     * @param roomid 聊天室id
     * @param needOnlineUserCount 是否需要返回在线人数，true或false，默认false
     * @return
     */
    public static String chatroomGet(Long roomid, String needOnlineUserCount) {
        String url = BaseUrl + "chatroom/get.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("needOnlineUserCount", needOnlineUserCount));

        return post(url, params);
    }

    /**
     * 聊天室信息更新
     * @param roomid  聊天室id
     * @param name  聊天室名称，长度限制128个字符
     * @param announcement  可选，公告，长度限制4096个字符
     * @param broadcasturl 直播地址，长度限制1024个字符
     * @param ext 可选，扩展字段，最长4096字符
     * @param needNotify 可选，true或false,是否需要发送更新通知事件，默认true
     * @param notifyExt 可选，通知事件扩展字段，长度限制2048
     * @return
     */
    public static String chatroomUpdate(Long roomid, String name, String announcement, String broadcasturl,
                                        String ext, String needNotify, String notifyExt) {
        String url = BaseUrl + "chatroom/update.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        announcement = StringUtil.isEmpty(announcement)? Constants.ANNOUNCEMENT_DEF : announcement;

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("announcement", announcement));
        params.add(new BasicNameValuePair("broadcasturl", broadcasturl));
        params.add(new BasicNameValuePair("ext", ext));
        params.add(new BasicNameValuePair("needNotify", needNotify));
        params.add(new BasicNameValuePair("notifyExt", notifyExt));

        return post(url, params);
    }

    /**
     * 聊天室修改开/关闭状态
     * @param roomid  聊天室id
     * @param operator  操作者账号，必须是创建者才可以操作
     * @param valid  true或false，false:关闭聊天室；true:打开聊天室
     * @return
     */
    public static String chatroomToggleCloseStat(Long roomid, String operator, String valid) {
        String url = BaseUrl + "chatroom/toggleCloseStat.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("operator", operator));
        params.add(new BasicNameValuePair("valid", valid));

        return post(url, params);
    }

    /**
     * 往聊天室内添加机器人
     * @param roomid 聊天室id
     * @param accids 机器人账号accid列表，必须是有效账号，账号数量上限100个
     * @param roleExt 可选，机器人信息扩展字段，请使用json格式，长度4096字符
     * @param notifyExt 可选，机器人进入聊天室通知的扩展字段，请使用json格式，长度2048字符
     * @return
     */
    public static String chatroomAddRobot(Long roomid, List<String> accids, String roleExt, String notifyExt) {
        String url = BaseUrl + "chatroom/addRobot.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("accids", JSON.toJSONString(accids)));
        params.add(new BasicNameValuePair("roleExt", roleExt));
        params.add(new BasicNameValuePair("notifyExt", notifyExt));

        return post(url, params);
    }

    /**
     * 从聊天室内删除机器人
     * @param roomid 聊天室id
     * @param accids 机器人账号accid列表，必须是有效账号，账号数量上限100个
     * @return
     */
    public static String chatroomRemoveRobot(Long roomid, List<String> accids) {
        String url = BaseUrl + "chatroom/removeRobot.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("accids", JSON.toJSONString(accids)));

        return post(url, params);
    }

    /**
     * 往聊天室内发消息
     * @param roomid 聊天室id
     * @param msgId 客户端消息id，使用uuid等随机串，msgId相同的消息会被客户端去重
     * @param fromAccid 消息发出者的账号accid
     * @param msgType 消息类型：
            0: 表示文本消息，
            1: 表示图片，
            2: 表示语音，
            3: 表示视频，
            4: 表示地理位置信息，
            6: 表示文件，
            10: 表示Tips消息，
            100: 自定义消息类型
     * @param ext 消息扩展字段，内容可自定义，请使用JSON格式，长度限制4096字符
     * @return
     */
    public static String chatroomSendMsg(Long roomid, String msgId, String fromAccid, Integer msgType, String ext) {
        String url = BaseUrl + "chatroom/sendMsg.action";
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        params.add(new BasicNameValuePair("roomid", roomid.toString()));
        params.add(new BasicNameValuePair("msgId", msgId));
        params.add(new BasicNameValuePair("msgType", msgType.toString()));
        params.add(new BasicNameValuePair("ext", ext));
        params.add(new BasicNameValuePair("fromAccid", fromAccid));

        return post(url, params);
    }

    /**
     * 往聊天室内发系统自定义消息
     * @param roomid 聊天室id
     * @param ext 消息扩展字段，内容可自定义，请使用JSON格式，长度限制4096字符
     * @return
     */
    public static String chatroomSendSystemCustomMsg(Long roomid, String ext) {
        String msgId = UUIDUtil.getUUID();
        String fromAccId = Constants.IM_ROOT_USER_ACCID;
        Integer msgTypeCustom = Constants.IM_MSG_TYPE_CUSTOM;
        return chatroomSendMsg(roomid, msgId, fromAccId, msgTypeCustom, ext);
    }
}
